package codetype.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class OderController {
    //    @Autowired
//    DiscoveryClient discoveryClient; //服务注册与发现，客户端对象
    @Autowired
    LoadBalancerClient loadBalancerClient; //负载均衡，客户端对象

    @Autowired
    RestTemplate restTemplate;

    @GetMapping
    public String Oder() {
        // 1.直接通过端口调用用户组件
//        String forObject = restTemplate.getForObject("http://127.0.0.1:1111", String.class);

        // 2.通过注册与发现调用用户组件（一台）
        //使用ribbon调用用户组件+restTemplate实现负载均衡(指调用多太用户组件服务器，防止某一台宕机而引起服务不可用)
//        List<ServiceInstance> users = discoveryClient.getInstances("USERS");
//        //调用用户组件
//        String forObject = restTemplate.getForObject(users.get(0).getUri(), String.class);
//        System.out.println(users.get(0).getUri());


        // 3.通过负载均衡调用（多台）用户组件
//        ServiceInstance users = loadBalancerClient.choose("USERS");
//        System.out.println(users.getUri()); //默认策略是轮循
//        String forObject = restTemplate.getForObject(users.getUri(), String.class);
        //4 .在配置文件中使用LoadBalane注解；可以使resrTemplate 具有Ribbon负载均衡的能力
        String forObject = restTemplate.getForObject("http://USERS", String.class);

        return "菜单中心调用用户中心的返回值是：" + forObject;
    }
}
